package language.basic.exception;

import java.io.IOException;

//1.在有多个catch语句时，catch只会自上而下匹配第一个符合的，匹配之后就不会匹配别的了，但是会执行finally块或者结束；
//2.在异常处理中return的情况：
//    在try或者catch块中return，依然会执行finally里的代码再返回。但如果在finally中return，就直接返回了。
//3.catch块里面throw异常
//    1. 不处理这个throw出的异常，程序就会直接跳转到finally执行（相当于return了）。
//    2. 也可以外包另一个try catch块来处理。

public class ExceptionControlFlow {
    public static void multiCatch() {
        try {
            throw new IOException("mythrow"); //try块里面抛出的异常也会被自己的catch捕获
        } catch (IOException e) {
            System.out.println("test1 choose first catch");
        } catch (Exception e){
            System.out.println("test1 choose second catch");
            e.printStackTrace();
        }
    }

    public static void returnInTry(){
        try {
            return;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("returnInTry reached finally");//try块里面抛出的异常也会被自己的catch捕获
        }
    }

    public static void returnInCatch(){
        try {
            throw new Exception();
        } catch (Exception e) {
            return;
        } finally {
            System.out.println("returnInCatch reached finally");//try块里面抛出的异常也会被自己的catch捕获
        }
    }

    public static void returnInFinally(){
        try {

        } catch (Exception e) {

        } finally {
            return;
            //System.out.println("cant reach here");
            //无法访问的语句，直接返回
        }
    }

    public static void exceptionInCatch() throws Exception {
        try {
        } catch (Exception e) {
            throw new Exception();
            //System.out.println("after language.basic.exception");
            //无法访问的语句
        } finally {
            System.out.println("reach finally");
        }
    }

    public static void main(String[] args) throws Exception {
        multiCatch(); //test1 choose first catch  没有e.printStackTrace();所以不打印异常调用栈信息
        returnInTry(); //test2 language.basic.exception final
        returnInCatch(); //test3 language.basic.exception final
        returnInFinally(); //
        exceptionInCatch(); //reach finally
    }
}
